public static class QuestCache
    {
        private static uint sub_6ABB30(uint cache, uint a2, uint id)
        {
            int v3 = Memory.Read<int>(cache + 0x24);
            if (v3 == -1)
            {
                return 0;
            }
            else
            {
                uint v4 = Memory.Read<uint>(cache + 0x1C);
                uint v5 = (a2 & (uint)v3);
                uint v6 = v4 + 12 * v5;
                uint v7 = Memory.Read<uint>(v6 + 0x8);
                if ((v7 & 1) != 0 && v7 == 0)
                {
                    v7 = 0;
                }
                while ((v7 & 1) == 0 && v7 != 0)
                {
                    uint v9 = Memory.Read<uint>(v6);
                    uint v10 = Memory.Read<uint>(v9 + v7 + 0x4);
                    if (Memory.Read<uint>(v7 + 0x14) == id)
                    {
                        return v7;
                    }
                    v7 = v10;
                }
                return 0;
            }
        }

        private static uint sub_6C0580(uint cache, uint a2)
        {
            if (a2 == 0)
            {
                return 0;
            }
            uint v2 = sub_6ABB30(cache + 0x8, a2, a2);
            if (v2 != 0)
            {
                if (Memory.Read<byte>(v2 + 0x2F08) != 0)
                {
                    return v2 + 0x18;
                }
            }
            return 0;
        }

        public static uint GetQuestCacheRowPtr(uint QuestId)
        {
            return sub_6C0580(Memory.BaseAddress + (uint)Offsets.Quests.QuestCache, QuestId);
        }
    }